Data communications systems can employ encoding and decoding to enhance security of the transmitted data. Such systems can also employ error detection and error correction to enhance reliability of transmitted data, for example to compensate for unreliability in the communication channel. Some systems employ hard decoding, which means deciding the value to assign for each input on a stand-alone basis, or soft decoding, which takes into account the reliability of each data point, or a combination of the two. Parity bits are often added to transmitted data and used as an error detecting code.
Forward error correction (FEC), or channel coding, is one approach for combining encoding with error correction by using an error-correcting code (ECC). Examples of ECCs include cyclic ECCs, such as BCH (Bose-Chaudhuri-Hocquenghem) codes. Depending on implementation details, a certain number of parity bits can correct for a maximum number of errors in the transmitted data.
FIG. 1 illustrates a known approach to row and column codeword encoding. FIG. 1 shows a common product code construction including row codewords, column codewords, and additional parity-on-parity (POP) codewords. Raw data is provided for encoding, the raw data being divided into R rows, where R is a positive integer. Typically, the R rows of raw data 10 are encoded first, for example by row encoding, creating computed row parity 12. The row parity 12 is created separately for each row of raw data. A row codeword 14 includes one row of the raw data 10 and the corresponding computed row parity 12. The plurality of row codewords 14 can be described as together defining column data 20 arranged in a plurality of columns. The column data 20 can be referred to as input data, or initial column codeword data (ICD), since it is provided as input data to the column encoding. As shown in FIG. 1, the ICD for each column comprises raw data 10, computed row parity 12, or a combination of the two.
Column encoding is performed on the ICD 20 creating column parity P 22. For example, the column parity 22 for column 1 is shown as P1. The column data 20 and column parity 22 in each column together form a column codeword 24. At this stage, each bit of row data 10 and row parity 12 is part of two codewords: a row codeword and a column codeword. After the row and column encoding, the rows of raw data 10 and the row parity 12 are “double-covered”, or present in two codewords, but the column parity 22 is not double-covered.
According to the known approach in FIG. 1, to double-cover the column parity 22, after the row codewords 14 and column codewords 24 have been created, the column parity 22 is further encoded to create parity-on-parity (POP) values 32. A POP codeword 34 is a row-like codeword that comprises all of the column parity 22 associated with the selected “row” and the corresponding POP values 32.
However, the known approach as described in relation to FIG. 1 has the following drawbacks: 1) the extra POP values that help double cover the column parity result in wasted parity space, which lowers the code rate; 2) the computed POP values themselves are only single covered, or present in a single codeword, which results in reduced error correction performance; and 3) there are 3 types of codewords to work with: row codewords, column codewords and parity-on-parity codewords, which results in a higher implementation complexity.
While existing error-correcting codes offer advantages such as very good error correction performance, this can come at the expense of high power consumption, long decode times, high encoder/decoder complexity, and/or high encoder/decoder implementation area. In certain implementations, these drawbacks are significant enough that the ECC cannot be employed.
Improvements in error correction approaches are desirable.